在第1节中,通过反射调用PackageManager的getPackageInfo方法实现了package size的获取,那么这个系统接口做了哪些事情呢,接下来就通过函数的调用堆栈来分析一下PackageManagerService这个服务.
PackageManager
首先看看我们调用的PackageManager
ApplicationPackageManager
getPackageSizeInfoAsUser是一个抽象方法,通过Context.getPackageManager()得到的时ApplicationPackageManager的实例,继续跟进ApplicationPackageManager
PackageManagerService
ApplicationPackageManager 其实只是对IPackageManager这个aidl接口的封装,该接口的实现在PackageManagerService中.属于framework层的代码,代码位于
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
getPackageSizeInfo里面把这个请求封装成MeasureParams之后通过mHandler send出去之后这个方法就返回了,顺着mHandler继续寻找,会调用到MeasureParams的handleStartCopy来处理请求
从handleStartCopy方法可以看到,在调用getPackageSizeInfoLI方法(计算/data/data/{pkg}/xxx下的size)成功之后,再计算与扩展卡相关的各种size,接下来看看getPackageSizeInfoLI的实现
|
|
其中最重要的一句是调用mInstaller.getSizeInfo(…)来计算size.
Installer
接着来看看Installer的getSizeInfo方法,代码位于:
frameworks/base/services/core/java/com/android/server/pm/Installer.java
其中最重要的一句时调用mInstaller.transact(…)发送了一个getsize的命令来计算size.
InstallerConnection
继续跟进InstallerConnection,代码位于:
frameworks/base/core/java/com/android/internal/os/InstallerConnection.java
这里面的逻辑比较简单,就是通过LocalSocketAddress连接到一个服务器,然后写入命令.至于这个服务器在哪里,里面的逻辑时怎么样的,我们下一节再进一步分析.